package jp.seraph.cui;

import java.util.List;

/**
 * Mode・Command・Dataの基底インターフェース
 *
 * Cuiシステムはファイルシステムと同様の階層構造を持つ。 ファイルシステムにおけるディレクトリに当たるのがModeである。
 * ファイルシステムにおけるファイルに当たるのがCommandである。 Modeは、内部に複数のModeとCommand、Dataを保持することができる。
 * Commandは何らかのデータを対象とする処理を表す。 DataはCommandの処理対象のデータを表す
 */
public interface SystemNode {
    public String getName();
    public void setName(String aName);

    /**
     * このSystemNodeを格納するModeを返す。
     * isRootメソッドがtrueを返す場合、自分自身を返す。
     *
     * @return
     */
    public Mode getParent();

    /**
     * このSystemNodeを格納するModeを設定する。
     * このメソッドはModeのaddChildから呼び出されるべきメソッドです。　ユーザは基本的に呼び出す必要はありません。
     *
     * @param aParent
     * @see SystemNode#isRoot()
     */
    public void setParent(Mode aParent);

    public SystemNodeType getType();

    public List<SystemNode> getChildren();

    /**
     * このSystemNodeの子のうち、型がEと代入互換性のあるもののみを含むListを返す。
     *
     * @param <E>
     * @param aDummy
     * @return
     */
    public <E extends SystemNode> List<E> getChildren(E aDummy);

    /**
     * このSystemNodeの子のうち、型がaTypeと代入互換性のあるもののみを含むListを返す。
     *
     * @param aType
     * @return
     */
    public List<SystemNode> getChildren(Class<? extends SystemNode> aType);

    /**
     * このSystemNodeの子のうち、型がaTypeと代入互換性のあるもののみを含むListを返す。
     *
     * @param aType
     * @return
     */
    public List<SystemNode> getChildren(SystemNodeType aType);

    /**
     * aNameの名前を持つ子を取得する
     *
     * @param aName
     * @return 存在すればその子　存在しなければnull
     */
    public SystemNode getChild(String aName);

    /**
     * このnodeを削除する
     */
    public void delete();

    /**
     * このNodeがNodeツリー上のRootになっているかどうかを返す。
     * @return Rootである場合true
     * @see SystemNode#getParent()
     */
    public boolean isRoot();
}
